Process scheduler employing adaptive partitioning of process threads

ABSTRACT

A system includes a processor and memory storage units storing software code. The software code comprises code for a scheduling system and for generating a plurality of adaptive partitions that are each associated with one or more process threads and that each have a corresponding processor budget. The code also is executable to, when the system is under a normal load, allocate the processor to one of the threads that is in a ready state and has the highest priority among the process threads that are in a ready state. The code is also executable to, when the system is in overload, allocate the processor to one of the process threads that is in a ready state and has the highest priority among the process threads that are in a ready state and for which the adaptive partition that the process thread is associated with has available guaranteed processor budget.

PRIORITY CLAIM

This application is a continuation of U.S. patent application Ser. No.11/317,468, filed Dec. 22, 2005, and issued as U.S. Pat. No. 8,434,086,which claims the benefit of priority from U.S. Provisional ApplicationNo. 60/662,070, filed Mar. 14, 2005, each of which are incorporatedherein by reference.

BACKGROUND OF THE INVENTION

1. Technical Field

The present invention is directed to a manner in which an operatingsystem schedules the running of threads and the like. More particularly,the invention is directed to an operating system having adaptivepartition scheduling for process threads.

2. Related Art

The kernel of an operating system should be capable of dividing up CPUresources so that each thread that is active in the system obtains anadequate amount of CPU time to properly execute the correspondingprocess. To this end, the kernel may implement a scheduling system thatdetermines how the available CPU time is allocated between multiplethreads.

There are at least three types of process scheduling systems: a FIFOscheduling system; a round-robin scheduling system; and a sporadicscheduling system. In each system, a priority value is assigned to eachthread of a process that is executed by the CPU. High priority valuesare assigned to threads that may be important to the operation of theoverall system while threads that may be less important to the operationof the system have lower priority values. Whether the scheduling systemgives a thread access to the CPU also depends on the state of thethread. For example, a thread may be ready or blocked (although otherstates also may be used). A thread is ready when it is capable of beingexecuted in that all conditions needed for it to run have been met. Incontrast, a thread is blocked when it tries to initiate an operationthat cannot be completed immediately and must wait for the completion ofsome event before execution of the thread may continue.

In a FIFO scheduling system, the currently executing thread continues touse all of the CPU time until it gives up the CPU by blocking, itfinishes execution, or it is preempted by a higher priority thread. Onceone of these criterion are met, the FIFO scheduling system allocates theCPU to the highest priority process/thread that is in a ready state.Generally, there is one ready queue for each priority level.

A round-robin scheduling system uses an additional parameter, atimeslice, to allocate CPU time to a thread. A timeslice is an amount oftime during which a thread is allowed to access the CPU. In around-robin scheduling system, the currently executing thread continuesto use all of the CPU time until the occurrence of one of the followingevents: 1) the currently executing process blocks; 2) the currentlyexecuting process finishes; 3) the currently executing process ispreempted by a higher priority thread; or 4) the currently executingprocess uses up its timeslice. Once the currently executing processblocks or uses up its timeslice, it is put at the back of the readyqueue for its priority level.

Sporadic scheduling is somewhat similar to round-robin scheduling. In asporadic scheduling system, the currently executing process continues touse all of the CPU time until the occurrence of one of the followingevents: 1) the currently executing process blocks; 2) the currentlyexecuting process finishes; 3) the currently executing process ispreempted by a higher priority thread; or 4) the currently executingprocess uses up a capped limit on the execution time assigned to thethread within a given period of time. The capped limit is known as abudget, while the given period of time in which this budget may be usedis known as the replenishment period. In operation, the budget for athread is replenished upon expiration of the replenishment period. Oncethe currently executing process blocks, it is put at the back of theready queue for its priority level. However, if the currently executingprocess uses up its budget within the replenishment period, its prioritylevel is reduced by a predetermined value and it is placed at the backof the ready queue for this lower priority level. The priority level ofthe process/thread may be returned to its original value in response toa number of different conditions.

In certain operating systems, such as those available from QNX SoftwareSystems in Kanata, Ontario, each thread in the system may run using anyof the foregoing scheduling systems. Consequently, the schedulingsystems are effective on a per-thread basis for all threads andprocesses on a node. Each thread is assigned to a particular schedulingsystem type through the operation of the process/thread itself. Thisprovides the software designer with a significant degree of designflexibility, but also involves a need for coordination between softwaredesigners implementing code for the same system. This coordinationincludes the assignment of priorities to the different threads as wellas the scheduling system type assigned to each thread.

Some available operating systems apply scheduling on a global basis. Onesuch global scheduling system is known as fair-share scheduling. In afair-share scheduling system, CPU usage may be equally distributed amongsystem users, groups, or processes. For example, if four users (A,B,C,D)are concurrently executing one process each, the fair-share schedulerwill logically divide the available CPU cycles such that each user gets25% of the whole (100%/4=25%). If user B starts a second process, eachuser will still receive 25% of the total cycles, but both of user B'sprocesses will each receive 12.5% of the total available CPU time. Onthe other hand, if a new user starts a process on the system, thescheduler will reapportion the available CPU cycles such that each usergets 20% of the whole (100%/5=20%).

Another layer of abstraction allows partitioning of users into groups,and application of the fair share system to the groups as well. In thiscase, the available CPU cycles are divided first among the groups, thenamong the users within the groups, and then among the processes for thatuser. For example, if there are three groups (1, 2, 3) containing three,two, and four users respectively, the available CPU cycles may bedistributed as follows: 100%/3 groups=33.3% per group Group 1: (33.3%/3users)=11.1% per user Group 2: (33.3%/2 users)=16.7% per user Group 3:(33.3%/4 users)=8.3% per user. Other percentage distributions among thegroups also may be used.

One manner of logically implementing fair-share scheduling strategy isto recursively apply a round-robin scheduling strategy at each level ofabstraction (processes, users, groups, etc.). In round robin scheduling,threads of equal importance or priority take turns running. They eachrun for intervals, or timeslices, that are the property of each threador group of threads.

While the foregoing scheduling systems have advantages in differentapplications, they may experience deficiencies when used in certainsystem applications. For example, when per-thread scheduling systems areused in real-time systems where the latencies of a process/thread havebeen planned solely through the assignment of priority levels, very longlatencies for low-priority threads may occur. Malicious softwareprocesses may configure themselves for high priority execution andthereby preempt proper scheduling of lower priority threads. Thisproblem also may occur, for example, during system development when ahigh priority thread malfunctions and enters an infinite loop. Globalfair-share scheduling systems may avoid such problems, but lack theresponsiveness needed for use in a real-time system. Therefore, a needexists for a scheduling system that may effectively allow high-prioritythreads to operate on a real-time basis while concurrently providingsome sort of fair-share CPU access to all threads.

SUMMARY

A system is set forth that comprises a processor, such as a singleprocessor or symmetric multiprocessor, and one or more memory storageunits. The system also includes software code that is stored in thememory storage units. The software code is executable by the processorand comprises code for generating a plurality of adaptive partitionsthat are each associated with one or more software threads. Each of theadaptive partitions has a corresponding processor budget. The code alsois executable to generate at least one sending thread and at least onereceiving thread. The receiving thread responds to communications fromthe sending thread to execute one or more tasks corresponding to thecommunications. A scheduling system also forms at least part of the codethat is executable by the processor. In operation, the scheduling systemselectively allocates the processor to each sending and receiving threadbased, at least in part, on the processor budget of the adaptivepartition associated with the respective thread. In this type ofsending/receiving environment, the scheduling system bills the processorbudget of the adaptive partition associated with the sending thread forprocessor allocation used by the receiving thread to respond tocommunications sent by the sending thread.

Other systems, methods, features and advantages of the invention willbe, or will become, apparent to one with skill in the art uponexamination of the following figures and detailed description. It isintended that all such additional systems, methods, features andadvantages be included within this description, be within the scope ofthe invention, and be protected by the following claims.

BRIEF DESCRIPTION OF THE DRAWINGS

The invention can be better understood with reference to the followingdrawings and description. The components in the figures are notnecessarily to scale, emphasis instead being placed upon illustratingthe principles of the invention. Moreover, in the figures, likereferenced numerals designate corresponding parts throughout thedifferent views.

FIG. 1 is a schematic block diagram of one embodiment of a system thatmay execute a process scheduler in accordance with the teachings of thepresent invention.

FIG. 2 is a diagram illustrating a number of different interrelatedprocesses that may be used to set up a process scheduler that employsadaptive partitions.

FIG. 3 is a diagram of one exemplary process scheduler that employs aplurality of adaptive partitions with their associated threads andthread priorities.

FIG. 4 is a diagram of a further exemplary process scheduler thatemploys a plurality of adaptive partitions with their associated threadsand thread priorities, where the process scheduler is operating underdifferent conditions than those shown in FIG. 3.

FIG. 5 is a diagram of an exemplary process scheduler that employs aplurality of adaptive partitions with their associated threads andthread priorities, where at least one of the ready threads has beendesignated as a critical thread.

FIG. 6 is a flow diagram showing a plurality of interrelated processesthat may be used to implement the process scheduler in a softwareenvironment in which there are sending threads and receiving threads.

FIG. 7 is a diagram illustrating the operation of the process schedulerdescribed in connection with FIG. 6.

FIG. 8 is a flow diagram showing a plurality of interrelated processesthat may be used to schedule the running of threads associated with thevarious adaptive partitions.

FIG. 9 is a flow diagram showing a plurality of interrelated processesthat may be used to determine whether the process scheduler bills theguaranteed budget or critical budget associated with the running thread.

FIG. 10 is a flow diagram showing a plurality of interrelated processesthat may be used to calculate the relative budget used by an adaptivepartition, where the value of the relative budget used may be employedin the process shown in FIG. 8.

FIG. 11 is a flow diagram showing a plurality of interrelated processesthat may be used to schedule the running of threads that access the samemutexes.

DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENTS

FIG. 1 is a schematic block diagram of a system 100 that may execute aprocess scheduler employing an adaptive partitioning of process threads.System 100 includes a central processing unit 105 (“CPU”) that mayaccess software code stored in memory 110. CPU 105 also may be disposedto access various devices/system components through an I/O interface115. The devices/system components may include, for example, sensors,human interface devices, network nodes, printers, storage devices, orthe like. The processors in a symmetric multiprocessing system,regardless of the number, may be considered in the same manner as asingle processor and are likewise included in the scope of therepresentation by block 105.

Memory 110 may be used to store, among other things, the software codethat defines the functions that are to be executed by the system 100.Although memory 110 is shown as a single unit, it may be implemented asmultiple memory units of the same or different memory type. For example,memory 110 may be implemented with multiple flash memory devices.Alternatively, or in addition, memory 110 may be implemented with one ormore flash memory devices and one or more hard disc storage devices. Itwill be recognized that a substantial number of alternative memorydevice combinations may be used to implement memory 110.

Some of the software code that may be stored in memory 110 and executedby CPU 105 is identified in FIG. 1. The identified software code shownhere includes an operating system 120 and one or more softwareapplications 125. In this example, a process scheduler 130 and devicedrivers 135 are included as members of the operating system 120. Theprocess scheduler 130 and device drivers 135, however, also may beimplemented as software modules that are separate from the operatingsystem 120. Software applications 125 may be used to define thehigh-level functions that system 100 is to perform. Device drivers 135may be used to provide a hardware abstraction layer through whichsoftware applications 125 communicate with the hardware components ofthe system 100. The hardware components may include the componentsaccessed through I/O interface 115.

Process scheduler 130 comprises the executable software code that isused to allocate the processing time of the CPU 105 (“CPU time”) to eachthread of the system 100. The CPU time may be allocated so that eachthread obtains an adequate amount of CPU time to properly execute thecorresponding process.

FIG. 2 is a flow chart showing a number of interrelated operations thatmay be used to implement the process scheduler 130. The flow chart ofFIG. 2 illustrates many of the values and operational characteristicsused in the process scheduler 130. Some values or operationalcharacteristics may be fixed as a result of user choices during thedesign process, while other values or operational characteristics areprovided through configuration data provided by a user and/or throughsoftware programming of the system 100.

As shown, the process scheduler 130 creates a number of differentadaptive partitions at block 205. Each adaptive partition constitutes avirtual container for scheduling attributes associated with a set ofprocess threads that have been grouped together by the process scheduler130. Threads that work toward a common or related function may beassigned to the same adaptive partition. In object-oriented systems, theadaptive partitions may be generated as instances of an adaptivepartition class that includes corresponding scheduling methods andattributes. Each of the adaptive partitions generated at block 205 isuniquely identified for further access by the process scheduler 130.

The number of partitions generated by the process scheduler 130 may beinitiated through the use of configuration parameters. The configurationdata may be provided by user initiated commands or through programs thatinterface with the process scheduler 130.

At block 210, the size of the averaging window that will be used by theprocess scheduler 130 is calculated. As will be set forth in furtherdetail below, the averaging window is the time over which the processscheduler 130 attempts to keep adaptive partitions at their guaranteedCPU percentages when the system is overloaded. A typical time is 100milliseconds, though other averaging window sizes may be appropriate.The averaging window size may be specified at boot time, and may berespecified any time thereafter as well. Considerations in choosing thesize of the averaging window may include:

-   -   A short duration averaging window size reduces the accuracy of        CPU time-balancing.    -   When a short duration averaging window is used, partitions that        exhaust their budgets because other partitions are using less        than their guaranteed percentage may not have to pay the time        back.    -   In some instances, a long duration averaging window size may        cause some adaptive partitions to experience runtime delays.

The size of the averaging window (“windowsize”) may be assigned in termsof milliseconds, which the scheduling process 130 converts to clockticks. A clock tick is the interval between clock interrupts (the systemtimer). All of the time budgets used by the scheduling process 130 maybe averaged over the same windowsize.

At block 215, the scheduling process 130 assigns a guaranteed CPU timebudget to each adaptive partition. The guaranteed budget may be assignedas a percentage of the overall available system budget. The sum of alladaptive partitions' CPU percentages in such instances will be 100%. Forthe purpose of assigning shares of the overall CPU time budget, theprocessors in a symmetric multiprocessing system, regardless of thenumber, may be considered in the same manner as a single processor.

The guaranteed budget used for each adaptive partition may be determinedin a number of different manners. For example, the CPU time used by eachpartition under several different load conditions may be measured andthey used to construct a graph of load versus CPU time consumed by eachpartition. Measurements also may be made under overload conditions.Using this information, a system designer may balance the needs of thevarious threads contained in each partition under the various conditionsand assign the appropriate guaranteed CPU time budgets. The measurementsalso may be used to dynamically vary the guaranteed CPU time budgetswith respect to CPU load conditions. For example, the process scheduler130 may operate in accordance with different operating modes in responseto different operating conditions. While operating in a particular mode,the process scheduler 130 employs a unique set of adaptive partitionparameters. The availability and parameters associated with a particularmode may be specified at boot time. A application programming interface(“API”) at run-time may be used to switch modes as needed. For example,a first set of guaranteed CPU time percentages may be employed duringstartup while a second set of guaranteed CPU time percentages may beemployed during normal operations after system startup has beencompleted.

A priority is assigned to each thread and each thread is associated witha respective adaptive partition at block 220. Functionally-relatedsoftware may be assigned to the same adaptive partition. This effects ahybrid process scheduling system in which the priority assigned to athread as well as the guaranteed CPU time percentages of the adaptivepartitions are used in the scheduling decisions executed by the processscheduler 130.

In assigning the threads to respective adaptive partitions, adaptivepartition scheduling may be used as a structured way of deciding whenthe running of a particular function of the system will be inhibited.When used in this manner, separate threads may be placed into differentadaptive partitions based on whether the threads should be starved ofCPU time under a particular set of circumstances. For example, supposethe system 100 is designed to operate as a packet router. Some of theprocesses that may be executed by a packet router include 1) routingpackets; 2) collecting and logging statistics for packet routing; 3)route-topology protocols with peer routers; and 4) collecting loggingand route-topology metrics. In such instances, the threads of theseprocesses may be assigned to two adaptive partitions: one for threadsassociated with routing and one for threads associated with the topologyof the network. When the system is overloaded, i.e., there is moreoutstanding work than the machine may possibly accomplish. Consequently,there may be a need to determine which applications are to be runslower. To this end, it may be preferable to route packets as opposed tocollecting routing metrics if the CPU does not have enough resources toexecute threads for both routing and metrics. It also may be reasonableto run the threads associated with network topology protocols, even whenCPU resources are limited. Under these circumstances, it may bepreferable to employ three adaptive partitions as opposed to the twoadaptive partitions initially considered. The three adaptive partitions,along with exemplary guaranteed budgets, may include:

-   -   an adaptive partition for routing packets (80% share);    -   an adaptive partition for topology protocols, (15% share), but        with maximum thread priorities higher than the threads in the        adaptive partition for routing packets; and    -   an adaptive partition, (5% share), for logging of both routing        metrics and topology-protocol metrics.

In this case, adaptive partition scheduling has been used to reorganizevarious system functions so that certain functions are given priorityduring high CPU loads, while still ensuring that all system functionsare given CPU execution time. Threads associated with routing andthreads associated with logging routing metrics have been associatedwith separate adaptive partitions despite the fact that they arefunctionally related to routing operations. Similarly, two functionallyunrelated components, routing metric logging and topology metriclogging, have been associated with the same adaptive partition. Thismanner of assigning the various threads to different partitions enablesthe process scheduler 130 to reduce CPU time usage by the loggingthreads under high CPU load conditions and give priority to routingthreads and topology protocol threads while still conducting metricslogging.

At block 225, a determination may be made as to which threads of thesystem will be allowed to run in a critical state. Designating a threadas critical gives it the ability to run in a manner that approximates areal-time system, even when the guaranteed budget for the adaptivepartition budget might otherwise be exceeded. When a critical threadassociated with a particular adaptive partition is run despite the lackof guaranteed budget for the adaptive partition, the adaptive partitionis said to have gone into short-term debt. Critical threads may beassociated with the various partitions, for example, at boot time.Critical threads are discussed in further detail below.

Each adaptive partition that is associated with a critical thread isassigned a critical time budget at block 235. The critical time budgetmay be specified, for example, in time units, such as milliseconds. Inthe exemplary system, the critical time budget is the amount of CPU timeavailable to all critical threads associated with a given adaptivepartition above that partition's guaranteed time budget during anaveraging window. By employing critical designations and critical timebudgets, a critical thread generally has an opportunity to run on theCPU even if its associated adaptive partition has exhausted itsguaranteed budget. This will occur as long as the partition still hascritical time budget available. Critical threads may provide the abilityfor real-time behavior within these partitions.

Various policies that the process scheduler 130 must follow may beoptionally assigned to the system 100 at block 240. For example, abankruptcy policy may be applied to one or more of the adaptivepartitions to determine how the system 100 and/or process scheduler 130handles a bankrupt state of the adaptive partition. Bankruptcy of acritical adaptive partition occurs when the adaptive partition hasexhausted both its guaranteed CPU time budget and critical time budgetover the duration of the averaging window. As a further example, system100 may execute an overload notification policy that allows a process toregister with the process scheduler 130 so that it is notified when asystem overload occurs. A system overload occurs, for example, when allof the ready threads cannot be executed on the CPU over the duration ofthe averaging window. A process may register to be informed of anoverload condition when the system 100 enters and/or leaves the overloadstate. Applications may use this overload notification to gracefullydegrade their service, for example, by skipping less importantfunctions, or by reducing the precision of computation. Adaptivepartitions may go over budget when some other adaptive partition issleeping, as will be set forth below. This is not by itself necessarilyconsidered to be a system overload, and therefore does not requiretriggering of the overload-notification policy.

At block 245, the process scheduler 130 is configured with datacorresponding to the foregoing states, values and/or assignmentsprovided at blocks 205 through 240. As noted above, these states, valuesand/or assignments may be provided for use in the system 100 in a numberof different manners, such as, by the system designer, by the systemuser, through other software programs, etc.

Block 250 represents execution of the threads in accordance with theconfiguration data of block 245. The attributes of the various adaptivepartitions may be dynamic. To this end, the parameters set forth in oneor more of the foregoing blocks may be changed in response to systemrequirements, system state, changes in system functions, etc., asrepresented by the flowline returning to block 205.

The threads in system 100 also may vary dynamically over time. Forexample, a thread or group of threads associated with an adaptivepartition may spawn, or generate, other threads during operation. Theoriginating thread may be referred to as a parent thread while a spawnedthread may be referred to as a child thread. Process scheduler 130 maybe configured so that child threads inherit the adaptive partition oftheir parent thread automatically. Alternatively, or in addition, an APImay be provided that will allow spawning threads into other adaptivepartitions. Such an API may be made available only to code withsufficient privilege. For example, a system application launcher mayhave such privileges.

FIG. 3 illustrates one manner in which the process scheduler 130 mayoperate under normal load conditions in which none of the partitionsexceeds its CPU budget. In this example, the process scheduler 130 hasgenerated three adaptive partitions 301, 302 and 303. Adaptive partition301 may be associated with the threads 305, 306, 307, and 308, of amultimedia application. Adaptive partition 302 may be associated withthe threads 315, 316, 317, 318, and 319 of a Java application. Adaptivepartition 303 may be associated with the threads 320, 325, 330, 335, and340 of a system logging application. The threads 305-345 have variousscheduling priorities, denoted in parentheses in FIG. 3, that may beindependent of the guaranteed budget of the associated adaptivepartition.

In operation, each adaptive partition 301-303 and thread 305-345 mayassume different operative states. Adaptive partitions 301-303, forexample, may operate in an active state or a sleep state. In the activestate, the scheduling attributes of the adaptive partition may be usedto schedule CPU time for the associated threads. A sleep state occurswhen there are no ready threads associated with the adaptive partition.In such instances, the process scheduler 130 effectively treats theadaptive partition as non-existent.

Threads may assume, for example, a running state, a ready state or ablocked state. A thread is in the running state while it is beingexecuted by the CPU. It is in a ready state when a set of conditionshave been met that render the thread fully prepared for execution by theCPU at a time determined by the process scheduler 130. A thread is inthe blocked state while the thread waits for the occurrence of one ormore events. While in the blocked state, the thread is not ready toconsume any CPU resources. Once the events awaited by the thread occur,the thread may become unblocked and enter the ready or running state.

The adaptive partitions 301-303 and corresponding threads 305-345 can beused to describe the operation of the process scheduler 130 duringvarious load conditions. In this example, the process scheduler 130makes the CPU available to execute ready threads 308, 315, and 345assigned to each adaptive partition 301, 302, and 303, based on thepriority of the ready threads. Under normal load conditions, thehighest-priority thread in the system 100 will run immediately when itbecomes ready. Whether a thread is ready may be indicated to the processscheduler 130 in a number of different manners including, for example,through the occurrence of an interrupt event or the like. In theillustrated example, the highest priority ready thread is thread 345,which has a priority of 17. Thread 345 will continue to operate in arunning state until it is finished, blocked, or until the budget foradaptive partition 303 is exhausted. Under heavy load, if an adaptivepartition exceeds its CPU budget, then its highest-priority thread doesnot run until the partition once again has time available in its CPUbudget. This is a safeguard on the system 100 that divides insufficientCPU time among the partitions 301, 302, and 303. In this state, theprocessor runs the highest-priority thread in an adaptive partition withCPU time remaining in its guaranteed CPU time budget.

When an adaptive partition enters a sleep state, the process scheduler130 allocates the CPU budget of the sleeping partition to other activeadaptive partitions—even if the other active adaptive partitions haveexceeded their budget. For example, if adaptive partition 303 enters asleep state, the process scheduler 130 allocates the budget for adaptivepartition 303 to adaptive partition 302, since adaptive partition 302has the highest priority ready thread 315. If two or more adaptivepartitions have threads with the same highest priority, the processscheduler 130 divides the free time in proportion to the other adaptivepartitions' percentages. This allocation assists in preventing longready-queue delay times in the case where two adaptive partitions havethe same priority.

In the example of FIG. 4, there are three adaptive partitions 401, 402,and 403, with 70%, 20% and 10% CPU budget guarantees, respectively.Further, each adaptive partition 401, 402, and 403, includes a readythread 408, 415, and 445, having a priority of 14. If adaptive partition401 enters a sleep state through a blocking of thread 408, the processscheduler 130 allocates all of the available CPU time to adaptivepartitions 402 and 403 in a 2:1 ratio, the ratio corresponding to theiroriginal CPU budget allocations. If adaptive partition 401 is in a sleepstate for a short time, then the process scheduler 130 may ensure thatpartition 401 later receives CPU time at its guaranteed CPU time budgetby reallocating the CPU resources so that adaptive partitions 402 and403 pay back the CPU time that each utilized at the expense of partition401. If adaptive partition 401 is in a sleep state for a long time, thensome or all of the time used by adaptive partitions 402 and 403 maybecome free. Whether an adaptive partition is in a sleep state for ashort time or a long time can be determined in various manners. Forexample, an adaptive partition can be said to be in a sleep state for ashort time when it is in the sleep state for a duration of time that isless than (windowsize)−(budget percentage*windowsize) millisecondswithin one averaging window.

If all adaptive partitions are at their CPU budget limits, then theprocess scheduler 130 may specify running of the highest-priority threadin the system 100. If two adaptive partitions have threads with the samehighest priority, then the adaptive partition that has used the smallestfraction of its budget may be run. This manner of operation may be usedto prevent long ready-queue delays that would otherwise occur. In theexample shown in FIG. 4, the window size may be 100 ms, adaptivepartition 401 is allotted 70% of the CPU budget and has used 40 ms,adaptive partition 402 is allotted 20% of the CPU budget and has used 5ms, and adaptive partition 403 is allotted 10% of the CPU budget and hasused 7 ms. All partitions have a ready thread at priority 14. In thissituation, thread 415 of adaptive partition 402 is run because itsrelative fraction free is 5 ms/20 ms, or 0.25, while the relativefraction free for adaptive partition 401 is 40 ms/70 ms or 0.57 and 7ms/10 ms or 0.70 for adaptive partition 403.

If an adaptive partition has exhausted the assigned CPU budget and oneor more of its ready threads are designated as critical, then theprocess scheduler 130 may allow the adaptive partition to use itscritical CPU budget to run the critical threads. The critical timebudget is the amount of CPU time that the process scheduler 130allocates to an adaptive partition to run all critical threadsassociated with the adaptive partition. This critical time budgetconstitutes CPU time that the process scheduler 130 allocates to theadaptive partition the partition's normal budget during an averagingwindow. Consequently, a critical thread may run even if the adaptivepartition with which it is associated is out of budget, as long as theadaptive partition has not exhausted its critical time budget.

FIG. 5 illustrates a system having two adaptive partitions 501 and 502.Threads 505, 506, 507, and 508 are associated with adaptive partition501, while threads 515, 516, 517, 518, and 519 are associated withadaptive partition 502. Adaptive partition 501 may comprise threads thatare associated with, for example, an airbag notification process.Threads 505 and 508 of adaptive partition 501 half been designated ascritical threads. However, only thread 508 is in a ready state.

In this example, adaptive partition 501 has exhausted its guaranteed CPUtime budget. Nonetheless, critical thread 508 may be allowed to runbecause of the importance that has been placed on it through thecritical designation. Consequently, the process scheduler 130 mayallocate CPU time to critical thread 508 provided there is still CPUtime in the critical time budget of adaptive partition 501.

When the process scheduler 130 schedules the running of a criticalthread, such as thread 508, the process scheduler bills the thread's runtime against the available guaranteed CPU time budget of the thread'sassociated adaptive partition. However, the process scheduler 130 countsthe CPU time used by the critical thread against the critical timebudget of the adaptive partition only if the process scheduler 130 wouldnot have otherwise run the critical thread. To this end, CPU time usedin running a critical thread is not counted against the critical timebudget of the associated adaptive partition when 1) the system is notoverloaded, or 2) the system is overloaded, but one or more adaptivepartitions may not be exhausting their guaranteed CPU time budgets.

A critical thread may remain in a critical running state until it entersa blocking state. That is, it may leave the running or ready state as isthe case with any other thread. As noted above, this may occur while thethread is waiting for a message, interrupt notification, etc. Thecriticality of a thread, or billing to its adaptive partition's criticaltime budget, may be inherited along with the adaptive partition duringoperations which trigger priority inheritance.

The short-term debt is bounded by the critical time budget specified forthe partition. Over time, the partition may be required to repayshort-term debt. A critical thread that exceeds the critical time budgetof the adaptive partition may be considered to drive the associatedadaptive partition into bankruptcy. Bankruptcy may be handled as anapplication error, and the designer may specify the system's response.Exemplary choices for a response include: 1) forcing the system toreboot; 2) notifying an internal or external system watchdog; and/or 3)terminating and/or notifying other designated processes. The system mayadd an entry to a log or the like if an adaptive partition exhausts itscritical time budget. When the budgets for the adaptive partitions aredynamically altered (through, for example, a mode change, an API call tomodify CPU percentages, or the like), the process scheduler 130 mayimpose a delay before testing an adaptive partition for bankruptcy. Thisallows the budgets to stabilize before an adaptive partition may bedeclared bankrupt.

The designation of a thread as critical may occur in a number ofdifferent manners. For example, the system may automatically markthreads that are initiated by an I/O interrupt as critical. The systemalso may specify a set of additional applications or operating systemnotification events, for example, timers, which may mark theirassociated handler threads as critical. An API also may be used to markselected threads as critical. Still further, child threads of criticalparent threads may be automatically designated as critical.

The process scheduler 130 also may be adapted for use in client/serversystems in which messages are passed from one or more sending/clientthreads for receipt and/or processing by one or more receiving/serverthreads. FIG. 6 shows a number of interrelated processes that may beused to implement process scheduler 130 in such a client/serverenvironment. At block 605, a client thread in a first adaptive partitionsends a message to a server thread in a second adaptive partition. Whena client thread sends a message to a server thread, the server threadthat receives the message may inherit the priority of the sendingthread. This prevents priority inversion, since the server thread isdoing work on behalf of the sending client. Inheriting of the prioritylevel of the sending thread by the server thread is shown at block 610.The process scheduler also may assign the same critical status of theclient thread to the server thread at block 610. At block 615, theprocess scheduler 130 may associate the server thread with the sameadaptive partition that is associated with the client thread.

FIG. 7 illustrates a system that may be used to explain some aspects ofthe operations shown in FIG. 6. In this example, there are threeadaptive partitions 701, 702, and 703. Adaptive partition 702 mayinclude server threads 720 and 725 of the type run, for example, by theprocesses of a file system. The attributes assigned to adaptivepartition 702 may vary with the design of the system. However, in thisexample, adaptive partition 702 has been generated with a CPU timebudget of zero, and threads 720 and 725 have been assigned a defaultpriority of 7. Adaptive partition 701 may comprise a number of differentthreads 705, 710, and 715, where thread 715 constitutes a client threadthat sends messages to one or more server threads of adaptive partition702. Similarly, adaptive partition 703 may comprise a number ofdifferent threads 730, 735, 740, and 745, where thread 745 constitutes aclient thread that sends messages to one or more server threads ofadaptive partition 702.

As shown by line 750 of FIG. 7, client thread 715 has passed a messagethat is received or otherwise processed by thread 720 of adaptivepartition 702. Similarly, client thread 745 of adaptive partition 703has passed a message that is received or otherwise processed by thread725 of adaptive partition 702, as indicated by line 755. When themessage transfers 750 and 755 occur, the process scheduler 130associates each server/receiving with the adaptive partition of thethread that sent the message. In this case, server thread 720 istemporarily associated with adaptive partition 701, as indicated by line760, and is assigned the same priority, 14, as thread 715. Likewise,server thread 725 is temporarily associated with adaptive partition 703,as indicated by line 765, and is assigned to the same priority, 12, asthread 745. Both threads 720 and 725 may be placed in a ready state,while threads 715 and 745 may be placed in a blocked state as therespective messages are processed. Once thread 720 has completedprocessing the message received from thread 715, thread 720 may returnto its original state where it is associated with adaptive partition 702with a default priority of 7. Also, thread 725 may return to itsoriginal state where it is associated with adaptive partition 702 with adefault priority of 7 once it has completed processing of the messagereceived from thread 745.

Sometimes, a client thread may attempt to communicate with a serverthread that is busy processing one or more messages that have beenpreviously received from other client threads. For example, if thread740 of adaptive partition 703 becomes unblocked and attempts to send amessage to server thread 725 while server thread 725 is busy processingone or more prior messages received from thread 745, server thread 725typically will be unable to respond to thread 740 until it has completedprocessing the prior messages from client thread 745. In such instances,the process scheduler 130 temporarily may raise the priorities of one ormore server threads that, for example, wait on the same connection pathas the client thread. The query and action corresponding to theseoperations are illustrated at blocks 620 and 625 of FIG. 6. As appliedto the system of FIG. 7, the connection path between threads assigned toadaptive partition 703 and threads assigned to adaptive partition 702,for example, may be assigned the same identification name/number. As aresult, the priority of server thread 725 may be raised in an attempt toreduce the latency that may otherwise occur before server thread 725 isavailable to process the message from client thread 740. Depending onthe nature of the threads in adaptive partition 702, the priority levelsof multiple server threads may be raised.

At block 630 of FIG. 6, the process scheduler 130 operates to bill theexecution time for each thread 720 and 725 in the appropriate manner.The appropriate manner of billing the execution time may vary. Onemanner includes applying the execution time of the receiving threadagainst the CPU budget and/or critical CPU budget of the adaptivepartition associated with the sending thread. In the example of FIG. 7,the execution time used by thread 720 in responding to a message sent bythread 715 is counted against the CPU budget and/or critical CPU budgetof adaptive partition 701. Similarly, the execution time used by thread725 in responding to a message sent by thread 745 is counted against theCPU budget and/or critical CPU budget of adaptive partition 703.

System components, such as filesystems, device drivers, and the like maybe assigned a guaranteed budget of zero. In such instances, the CPU timeused by the threads associated with the system component is billed totheir clients. However, sometimes the process scheduler 130 finds outtoo late which threads a particular system component thread has beenultimately working for. As a result, the process scheduler 130 may notbe able to bill the running of the threads of the system components in atimely manner and/or to the proper adaptive partition. Additionally,some system components, such as device drivers, may have backgroundthreads (e.g. for audits or maintenance) that require budgets thatcannot be attributed to a particular client. In those cases, the systemdesigner may measure the background operations and unattributable loadsassociated with the various system components. The resultingmeasurements may be used to provide non-zero budgets to the adaptivepartitions associated with the threads of the various system components.

In operation, the process scheduler 130 may do more than simply directthe running of the highest priority ready thread associated with anadaptive partition having guaranteed CPU time left in its budget. Forexample, when all adaptive partitions have exhausted their guaranteedCPU time budgets at approximately the same time, then the processscheduler 130 may direct the running of the highest priority thread inthe system irrespective of the attributes of the associated adaptivepartition. Also, when adaptive partitions have threads of the equalhighest priorities, the process scheduler 130 may assign CPU time usingthe ratio of their guaranteed CPU time percentages. Finally, criticalthreads may be run even if their adaptive partition is out of budget,provided the adaptive partition still possesses an amount of itscritical time budget.

Process scheduler 130 may employ one or more ordering functions, f(ap),associated with each adaptive partition, ap, in its schedulingdeterminations. Ordering functions may be calculated in a variety ofdifferent manners. The results obtained by calculating the orderingfunctions may be compared with one another to determine how the processscheduler 130 will scheduled the threads associated with the variousadaptive partitions of the system.

In calculating the ordering functions, f(ap), a number of differentvariables may be used. A view of the variables are described here inconnection with one example. In the following example, let“is_critcal(ap)” be a boolean variable. The value of “is_critcal(ap)”depends on 1) whether the adaptive partition, ap, has available criticalbudget, and 2) whether the highest priority ready thread in the adaptivepartition, ap, has been assigned a critical state. Let “has_budget(ap)”be a boolean variable that indicates whether an adaptive partition, ap,has consumed less CPU time than its guaranteed CPU time budget duringthe last averaging window. Let “highest_prio(ap)” be an integer variablethat indicates the highest priority of all ready-to-run threads in anadaptive partition, ap. Let “relative_fraction_used(ap)” be a realnumber variable that corresponds to the ratio of the number ofmicroseconds of CPU time consumed by the adaptive partition, ap, duringthe last averaging window, divided by the budget of the adaptivepartition, ap, when expressed, for example, in microseconds. Finally,let b(ap) be a boolean variable corresponding to the current rate of CPUtime consumption of threads in the adaptive partition, ap. Moreparticularly, b(ap) may be assigned a logical true value if, given thecurrent rate of CPU time consumption by the threads associated with thepartition, ap, the value of has_budget(ap) also would be a logical truevalue at the time the process scheduler 130 would likely be called uponto again schedule a thread associated with the adaptive partition.Otherwise, b(ap) may be assigned a logical false value. It will berecognized that other variables, or less than all of the foregoingvariables, may be used to calculate and ordering function f(ap). Whichvariables are used may be dependent on the system designer and/orend-user.

The value of b(ap) may be calculated in a number of different manners.For example, let the variable t indicate the current time in ahigh-resolution counter, and a tick be the length of time betweenregular events during which the process scheduler examines allpartitions. The period of the tick should be less than the size of theaveraging window (“windowsize”). Let the function cpu_time_used(t1,t2)correspond to a real value of the CPU time used by the threads ofpartition, ap, between absolute times t1 and t2. Further, let budget(ap)correspond to the time value of the guaranteed budget for the partition,ap. The value for b(ap) then may be calculated using the followingequation:b(ap)=Boolean(cpu_time_used(now,now-windowsize)−cpu_time_used(now-windowsize+tick,now-windowsize)<budget(ap)).

One manner of calculating an ordering function, f(ap) using theforegoing variables is shown in FIG. 8. The illustrated operations maybe executed for each adaptive partition, ap, used in the system 100. Asshown, the process scheduler 130 determines whether the partition hasany threads that are ready to run at block 800. If there are no readythreads associated with the adaptive partition, ap, the orderingfunction, f(ap), for the adaptive partition may be assigned the valuesf(0,0,0,0), at block 802 and calculation of the ordering function forthe next adaptive partition may be initiated at block 803. The processscheduler 130 determines if the adaptive partition, ap, has critical CPUbudget available at block 805 and, if so, whether the highest priorityready thread in the adaptive partition, ap, has been assigned a criticalstate. Based on this determination, the process scheduler 130 assignsthe appropriate logical state to the “is_critical(ap)” variable at block810. At block 813, the process scheduler 130 evaluates the CPU budgetused by the adaptive partition during the last averaging window. Atblock 815, the process scheduler 130 determines if the adaptivepartition has used less CPU time than its guaranteed CPU time budget.Based on this determination, the process scheduler 130 assigns theappropriate logical state to the “has_budget(ap)” variable at block 820.The relative ratio of CPU budget time used during the last averagingwindow is calculated at block 830 by taking the value obtained at block813 and dividing it by the guaranteed CPU budget time for that adaptivepartition. This value is assigned to the “relative_fraction_used(ap)”variable at block 835.

At block 840, the process scheduler 130 calculates one or more valuescorresponding to the current rate of CPU time consumption by threadsassociated with the adaptive partition. These values are used to assignthe appropriate logical state to the b(ap) variable at block 845.

Using all or a subset of the foregoing variables, the ordering function,f(ap), for the given adaptive partition, ap, is calculated at block 850.In this example, the ordering function, f(ap), is calculated using theordered values (x,a,y,z), where x=is_critical(ap) OR has_budget(ap);a=(Not x) AND b(ap); y=highest_prio(ap); andz=1-relative_fraction_used(ap). In calculating the ordering function,f(ap), the value of x is given more significance than the values of a,y, or z, the value of a is given more significance than the values of yor z, and the value of y is given more significance than the value of z.

The process scheduler 130 runs the highest priority thread of theadaptive partition having the largest f(ap) as shown at block 905 ofFIG. 9. However, the process scheduler 130 must determine whether therunning time for the thread is to be billed to the critical budget ofthe adaptive partition or solely to the guaranteed budget. To this end,the process scheduler 130 may compute another function, fcritical(ap),using one or more of the foregoing variables. In this example,fcritical(ap) is calculated using the ordered values (w,d,y,z), wherew=has_budget(ap); d=(NOT w) AND b(ap); y=highest_prio(ap); andz=1-relative_fraction_used(ap). In the calculation of fcritical(ap), thevalue of w is given more significance than the values of d, y, or z, thevalue of d is given more significance than the values of y or z, and thevalue of y is given more significance than the value of z. Thiscalculation is shown at block 910. A comparison between thefcritical(ap) and f(ap) values for the adaptive partitions is executedat block 915. If the value of fcritical(ap) is less than the value off(ap), then the running time for the thread is billed to the criticalbudget of the adaptive partition at block 920 as well as to theguaranteed budget at block 925. If the value of fcritical(ap) is greaterthan or equal to the value of f(ap), then the running time for thethread is solely billed to the guaranteed budget of the adaptivepartition at block 925. Any calculations used by the process scheduler130 should ensure that the critical budget for the adaptive partition isonly used if the highest priority critical thread associated with thatadaptive partition would not have been selected to run by processscheduler 130 had the thread or the partition not been critical.

FIG. 10 shows a number of different interrelated processes that may beused to execute a method for calculating the relative ratio of CPUbudget time consumed during the last averaging window, as described inblock 830 of FIG. 8. The relative fraction CPU budget time consumed byan adaptive partition is, for example, the number of microseconds thatthreads associated with the adaptive partition ran during the lastaveraging window divided by its share of the averaging window inmicroseconds. Alternatively, this may be expressed as(total_CPU_time_consumed)/(windowsize*percentage). To reduce thepotential need for floating-point division, the process scheduler 130may compute a number that has substantially the same ordering propertiesas (total_CPU_time_consumed)/(windowsize*percentage) for each adaptivepartition. Thus, a constant c(a) may be pre-computed so that theadaptive partition with the highest (total_CPU_time_consumed)*c(ap) alsois the adaptive partition with the highest(total_CPU_time_consumed)/(windowsize*percentage).

The function c(ap) may be precalculated during, for example, systemstartup, and whenever the guaranteed CPU budgets are reallocated betweenthe various adaptive partitions of the system. At block 1010, the CPUbudget percentage for each adaptive partition are determined, forexample, at start-up. At block 1015, the system may compute, for eachadaptive partition, a factor, q(ap). The value of q(ap) may becalculated, for example, as the product of the percentage CPU budgets ofall the other adaptive partitions. At block 1020, a scaling factor iscalculated. In this example, if the maximum averaging error is max_error(e.g. 0.005 for ½ a percent), then k=min(list of q(ap))*max_error. Aconstant scaling factor c(ap) is calculated at step 1025. In thisexample, c(ap) is calculated as c(ap)=q(ap)/k. The value,(total_CPU_time_consumed)*c(ap) has the same ordering properties as(total_CPU_time_consumed)/(windowsize*percentage) within an errortolerance of max_error.

To practically compare the relative fraction used by different adaptivepartitions, the process scheduler 130 may need to multiply the run timeof the threads associated with the adaptive partitions by c(ap). Howeverthe billed times may be large numbers. If the process scheduler 130 isto be implemented using single-multiply instructions in thesecalculations, the billed times may be first scaled choosing a number ofmost significant bits of the CPU budget time at block 1030. The degreeof scaling may be set by the value of max_error. However, any reasonablechoice for max_error (e.g. ¼ to ½%) can be satisfied by choosing onlythe most significant 16 bits of the billed run-time. In such instances,the system may be calculating (total_CPU_time_consumed)>>32*c(ap). Atblock 1035, the relative budget ratio is calculated as c(ap)*(adaptivepartition execution time), where (adaptive partition execution time)constitutes a selected number of the most significant bits of(total_CPU_time_consumed).

An error tolerance of 0.5% to 0.25% is considered sufficient for animplementation. However, the application may include the notion that forany specified error tolerance, a minimal number of bits is chosen toboth represent c(ap), the scaled value of the CPU time executed byadaptive partition ap, during the last averaging windowsize time, andthe product of c(ap) and the scaled CPU time. The minimal number of bitsis chosen for both representations and executing multiplicationfunctions so that all representations and arithmetic errors are lessthan or equal to a chosen error tolerance.

Billing of CPU time to each of the adaptive partition in a system maytake place in a number of different manners and may occur many timesduring the operation of the process scheduler 130. For example, billingof an adaptive partition may occur whenever 1) a thread starts runningfrom a blocked state, 2) a thread stops running (i.e., when it has beenpreempted by a higher priority thread, when it has been blocked, or thelike), and/or 3) at other times when an accurate accounting of the CPUtime is needed by the process scheduler 130.

Typically, process schedulers use standard timer interrupts, or ticks,to determine how long a thread has used the CPU. Tick periods are oftenon the order of one to several milliseconds.

The process scheduler 130, however, may include code that effectivelymicrobills the execution time of the various threads of the system. Tothis end, a high-resolution hardware and/or software counter having aperiod substantially less than the tick periods may be employed. Eachtime a thread starts or stops running, the process scheduler 130 assignsa timestamp to the associated partition corresponding to the value ofthe high-resolution counter. The timestamp values may be scaled to auseful common time unit. The differences between the timestamps foradjacent start and stop times of a thread are used to microbill theappropriate adaptive partition.

The high-resolution counter may be implemented in a number of differentmanners. For example, some CPUs have a built-in counter that incrementsat about the clock frequency at which the CPU is run. In suchsituations, the built-in counter may be used in the microbillingprocess. In another example, a high-resolution counter may be simulatedusing software by querying an intermediate state of a programmablecount-down timer that, for example, may normally be used to triggerclock interrupts. This may be the same counter used to provide anindication that a tick interval has occurred. In such situations, thetimestamps should take into consideration both the counter value and thenumber of ticks that have occurred from a given reference point in timeso that the timestamps accurately reflect the start times and stop timesof the individual threads.

The foregoing process scheduler 130 also may be used in systems thatemploy mutexes. Mutexes are used to prevent data inconsistencies due torace conditions. A race condition often occurs when two or more threadsneed to perform operations on the same memory area, but the results ofcomputations depend on the order in which these operations areperformed. Mutexes may be used for serializing shared resources. Anytimea global resource is accessed by more than one thread the resource mayhave a mutex associated with it. One may apply a mutex to protect asegment of memory (“critical region”) from other threads. Theapplication gives a mutex to threads in the order that they arerequested. However, the process scheduler 130 may be adapted to dealwith the problems that occur when a low-priority thread, which may holdthe mutex, unreasonably delays access to higher-priority threads thatare waiting for the same mutex.

FIG. 11 shows a method for prioritizing access to a mutex in an adaptivepartitioning system, when one thread may hold a mutex, and several otherthreads may be waiting for the same mutex. When the partition associatedwith the thread holding the mutex runs out of guaranteed CPU timebudget, the process scheduler 130 may begin billing the run time of thethread holding the mutex to the partition of the thread waiting for themutex which, of all the threads waiting for the mutex, is most likely torun next. The process scheduler 130 also may begin billing the run timeof any thread deemed to be working on behalf of the thread holding themutex to the adaptive partition associated with the thread holding themutex. A determination is made at block 1110 to identify the thread thatis most likely to run next (i.e., the thread that will run after thethread holding the mutex is blocked, finishes, or the like). The waitingthread, which may be waiting for the same mutex as the current threadholding the mutex, may be determined to be “most likely to run next”. Atblock 1115, the process scheduler 130 may raise the priority level ofthe thread holding the mutex to the priority of the waiting thread whichis most likely, of all the waiting threads, to run next. The processscheduler 130 may bill the adaptive partition associated with thecurrent thread holding the mutex for its running time while holding themutex until the adaptive partition's CPU budget is exhausted (reacheszero) at block 1120. At block 1125, the remaining CPU time used by theholding thread is billed to the adaptive partition that is associatedwith the waiting thread that is most likely to run next.

The thread “most likely to run next” may be computed by applying,pairwise, a “compare two threads” process repeatedly on pairs of threadsin a list of waiting threads. The “compare two threads” process may beexecuted as follows, where A and B are the two threads to be compared: Afunction f(ap) is constructed, which includes the ordered values(x,a,y,z). This is the same ordering function f(ap) constructed above.Then, let partition_of(X) mean the partition containing the thread X.Then, if f(partition_of(A))>f(partition_of(B), thread A is more likelyto run than thread B. The function f(X) is constructed for each threadto be compared until the thread with the highest f(X) is determined. Thethread with the highest f(X) may be determined to be the “thread mostlikely to run next” and its associated adaptive partition may be billedaccordingly for the running time of the thread holding the mutex oncethe adaptive partition associated with the thread holding the mutex hasexhausted its guaranteed CPU budget.

The systems and methods described above may be configured to run in atransaction processing system where it is more important to continue toprocess some fraction of the offered load rather than to fail completelyin the event of an overload of processing capacity of the system.Examples of such applications include Internet routers and telephoneswitches. The systems and methods also may be configured to run in otherreal-time operating system environments, such as automotive andaerospace environments, where critical processes may be designated thatneed to be executed during critical events. An example may be in anautomotive environment, where an airbag deployment event is a lowprobability event, but must be allocated processor budget should theevent be initiated.

The systems and methods also may be configured to operate in anenvironment where untrusted applications may be in use. In suchsituations, applications such as Java applets may be downloaded toexecute in the operating system, but the nature of the application mayallow the untrusted application to take over the system and create aninfinite loop. The operating system designer will not want such asituation, and may create appropriate adaptive partitions so theuntrusted application may be run in isolation, while limiting access toCPU time which other processes will have need of.

While various embodiments of the invention have been described, it willbe apparent to those of ordinary skill in the art that many moreembodiments and implementations are possible within the scope of theinvention. Accordingly, the invention is not to be restricted except inlight of the attached claims and their equivalents.

What is claimed is:
 1. A system comprising: a processor; one or morememory storage units; instructions stored in the one or more memorystorage units, where the instructions are executable by the processor toconfigure the system to: create a plurality of adaptive partitions eachhaving an associated guaranteed processor time budget; create aplurality of process threads each having a priority; dynamicallyassociating each of the plurality of process threads with any one of theplurality of adaptive partitions; and implement a process scheduler to:when the system is under a normal load, allocate the processor to aprocess thread, of the plurality of process threads, that is in a readystate and having a highest priority amongst process threads, of theplurality of process threads, that are in the ready state; and when thesystem is in overload, allocate the processor to a process thread, ofthe plurality of process threads, that is in the ready state, having ahighest priority amongst process threads, of the plurality of processthreads, that are in the ready state and for which the adaptivepartition that the process thread is associated with has availableguaranteed processor time budget; where a portion of the guaranteedprocessor time budget associated with each adaptive partition is billedwhenever the processor is allocated to a process thread associated withthe adaptive partition.
 2. The system of claim 1, the plurality ofprocess threads comprising a sending thread that sends a message and areceiving thread that receives the message; where the guaranteedprocessor time budget associated the adaptive partition with which thesending thread is associated is billed when the processor is allocatedto the receiving thread to process the message.
 3. The system of claim2, where the receiving thread is temporarily associated with theadaptive partition with which the sending thread is associated while thereceiving thread is processing the message.
 4. The system of claim 1,where the guaranteed processor time budget is allocated and billed oversuccessive averaging windows; and where the system is in overload whenall of the process threads in the ready state cannot be allocated theprocessor over the duration of one averaging window, of the successiveaveraging windows, and where the system is under normal load otherwise.5. The system of claim 1, where the guaranteed processor time budgetassociated with each of the plurality of adaptive partitions is dynamicand can be reallocated while the system executes.
 6. The system of claim1, where the process thread to which the processor is allocated runsuntil the process thread is finished, is blocked, or the guaranteedprocessor time budget associated with adaptive partition with which theprocess thread is associated is exhausted.
 7. The system of claim 6,where the process thread to which the processor is allocated furtherruns until the process thread is preempted and the processor isallocated to another process thread, of the plurality of processthreads, that is in the ready state and that has a priority higher thanthe priority of the process thread to which the processor is currentlyallocated.
 8. A method of scheduling a plurality of process threads,each having a priority and each dynamically associable with an adaptivepartition, for execution by a processor of a system, the methodcomprising: creating a plurality of adaptive partitions each having anassociated guaranteed processor time budget; associating one or moreprocess threads from the plurality of process threads with each of theplurality of adaptive partitions; when the processor is under a normalload, allocating the processor to a process thread, of the plurality ofprocess threads, that is in a ready state and having a highest priorityamongst process threads, of the plurality of process threads, that arein the ready state; and when the processor is in overload, allocatingthe processor to a process thread, of the plurality of process threads,that is in the ready state, having a highest priority amongst processthreads, of the plurality of process threads, that are in the readystate and for which the adaptive partition that the process thread isassociated with has available guaranteed processor time budget; where aportion of the guaranteed processor time budget associated with eachadaptive partition is billed whenever the processor is allocated to aprocess thread associated with the adaptive partition, where theguaranteed processor time budget associated with each of the pluralityof adaptive partitions is dynamic and can be reallocated while thesystem executes.
 9. The method of claim 8, further comprising: sending amessage from a sending thread of the plurality of process threads;receiving the message by a receiving thread of the plurality of processthreads; and billing the guaranteed processor time budget associated theadaptive partition with which the sending thread is associated when theprocessor is allocated to the receiving thread to process the message.10. The method of claim 9, further comprising: temporarily associatingthe receiving thread with the adaptive partition with which the sendingthread is associated while the receiving thread is processing themessage.
 11. The method of claim 8, where the guaranteed processor timebudget is allocated and billed over successive averaging windows; andwhere the system is in overload when all of the process threads in theready state cannot be allocated the processor over the duration of oneaveraging window, of the successive averaging windows, and where thesystem is under normal load otherwise.
 12. The method of claim 8, wherethe process thread to which the processor is allocated runs until theprocess thread is finished, is blocked, or the guaranteed processor timebudget associated with adaptive partition with which the process threadis associated is exhausted.
 13. The method of claim 12, where theprocess thread to which the processor is allocated further runs untilthe process thread is preempted and the processor is allocated toanother process thread, of the plurality of process threads, that is inthe ready state and that has a priority higher than the priority of theprocess thread to which the processor is currently allocated.